package com.distribuida.servidor;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

import com.distribuida.comum.Cliente;
import com.distribuida.interfaces.ServidorInterface;
import com.distribuida.supertrunfo.impl.Jogo;


public class Servidor extends UnicastRemoteObject implements ServidorInterface {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private static Servidor instance;

	protected Servidor() throws RemoteException {
		super();
		clientes = new ArrayList<Cliente>(10);
		jogos = new ArrayList<Jogo>();
	}
	
	public static Servidor getInstance(){
		if(instance == null){
			try {
				instance = new Servidor();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return instance;
	}
	
	private ArrayList<Cliente> 	clientes;
	public  ArrayList<Jogo> 	jogos;
	public static int porta = 1099;
	
	public ArrayList<Cliente> getClientes() {
		return clientes;
	}
	public void setClientes(ArrayList<Cliente> clientes) {
		this.clientes = clientes;
	}
	public boolean adicionaCliente(Cliente cliente) throws RemoteException{
		return clientes.add(cliente);
	}
	public boolean removeCliente(Cliente cliente){
		return clientes.remove(cliente);
	}
	public void updateTime(Cliente cliente){
		for(Cliente cli : clientes){
			if(cli.getId() == cliente.getId()){
				cli.setUltimoUpdate(System.currentTimeMillis());
			}
		}
	}
	public ArrayList<Cliente> buscaClientesSemUpdate(){
		ArrayList<Cliente> semUpdate = new ArrayList<Cliente>(clientes.size());
		for(Cliente cliente : clientes){
			if(cliente.getUltimoUpdate() < (System.currentTimeMillis() - 30000)){
				semUpdate.add(cliente);
			}
		}
		return semUpdate;
	}
	@Override
	public void atualiza(int id) throws RemoteException {
		for(Cliente cli : clientes){
			if(cli.getId() == id){
				System.out.println("Atualizando o ID: " + id);
				updateTime(cli);
			}
		}
		
	}
	public  ArrayList<Jogo> getJogos() {
		return jogos;
	}
	public void setJogos(ArrayList<Jogo> jogos) {
		this.jogos = jogos;
	}
	public ArrayList<Jogo> jogosEmAndamento(){
		ArrayList<Jogo> retorno = new ArrayList<Jogo>(jogos.size());
		for(Jogo jogo : jogos){
			if(jogo.getRodada() > 0 && ! jogo.podeTerminarJogo()){
				retorno.add(jogo);
			}
		}
		return retorno;
	}
	
	public Jogo getJogoPorId(int id) throws Exception{
		for(Jogo jogo : jogosEmAndamento()){
			if(jogo.getId() == id){
				return jogo;
			}
		}
		throw new Exception("Jogo inexistente!");
	}

}












